//package com.lzh.eventdemo.controller;
//
//import com.lzh.eventdemo.entity.Responses;
//import com.lzh.eventdemo.entity.Task;
//import com.lzh.eventdemo.queue.MockQueue;
//import com.lzh.eventdemo.service.TaskService2;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.context.request.async.DeferredResult;
//
///**
// * @Description: 组件：
// * controller层方法，接收请求、新建延期返回对象、设置超时方法、任务入队、返回
// * MockQueue队列，任务入队，处理任务、判断是否超时、放入完成队列
// * QueueListener完成队列监听器，监听完成队列，获取到完成的数据后，使用延期对象返回
// * Task任务,三个属性：延期返回对象、任务、是否超时
// * <p>
// * <p>
// * 流程：
// * controller层收到请求,消息入队
// * 队列监听到消息入队，处理消息
// * 如果超时任务触发，将超时状态改为true，并直接返回浏览器任务超时
// * 队列处理完任务后，判断是否超时，如果超时，中断任务，否则将任务加入完成队列
// * 完成队列监听器监听到消息入队，取出消息，使用延期返回对象返回
// * @Author: LiuZiHao
// * @Date: 2022/8/26 10:24
// */
//@RestController
//@RequestMapping("/test")
//@Slf4j
//public class DeferredResultTest {
//
//    @Autowired
//    private TaskService2 taskService2;
//
//    @Autowired
//    private MockQueue mockQueue;
//
//    @GetMapping(value = "/getResult")
//    public DeferredResult<Responses<String>> getResult() {
//        log.info("收到HTTP请求...");
//        long startTime = System.currentTimeMillis();
//
//        DeferredResult<Responses<String>> deferredResult = new DeferredResult<>();
//
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                taskService2.getData(deferredResult);
//            }
//        }).start();
//
//        log.info("接收HTTP请求线程任务已完成,退出!");
//        long endTime = System.currentTimeMillis();
//        log.info("http请求总耗时： " + (endTime - startTime) + "ms");
//
//        return deferredResult;
//
//    }
//
//    @RequestMapping("/test")
//    public DeferredResult<String> test(Long timeout) throws InterruptedException {
//        log.info("/test 收到请求:{}", timeout);
//
//        //新建延期返回对象并设置超时时间，优先级比configureAsyncSupport方法中默认配置中的高
//        DeferredResult<String> result = new DeferredResult<>(timeout);
//
//        //要执行的任务
//        Task<String> task = new Task<>(result, "test任务", false);
//
//        //设置超时后执行的任务，优先级比DeferredResultProcessingInterceptor拦截器中的高
//        result.onTimeout(() -> {
//            log.info("任务超时");
//            //告知该任务已经超时-此处应该加锁
//            task.setIsTimeout(true);
//            result.setErrorResult("任务超时");
//        });
//        result.onCompletion(() -> {
//            log.info("任务完成");
//            //告知该任务已经超时-此处应该加锁
//            String result1 = (String) result.getResult();
//            System.out.println("result1 = " + result1);
//        });
//
//        //任务入队
//        mockQueue.put(task);
//        return result;
//    }
//
//    @RequestMapping("/testForEach")
//    public DeferredResult<String> test(String timeout) throws InterruptedException {
//        log.info("/testForEach 收到请求:{}", timeout);
//
//        //新建延期返回对象并设置超时时间，优先级比configureAsyncSupport方法中默认配置中的高
//        DeferredResult<String> result = new DeferredResult<>();
//        for (int i = 0; i < 3; i++) {
//            result = fakeData();
//        }
//        //要执行的任务
//        Task<String> task = new Task<>(result, "test任务", false);
//
//        //设置超时后执行的任务，优先级比DeferredResultProcessingInterceptor拦截器中的高
//        result.onTimeout(() -> {
//            log.info("任务超时");
//            //告知该任务已经超时-此处应该加锁
//            task.setIsTimeout(true);
//            result.setErrorResult("任务超时");
//        });
//        result.onCompletion(() -> {
//            log.info("任务完成");
//            //告知该任务已经超时-此处应该加锁
//            String result1 = (String) result.getResult();
//            System.out.println("result1 = " + result1);
//        });
//
//        //任务入队
//        mockQueue.put(task);
//        return result;
//    }
//
//    DeferredResult<String> fakeData() {
//        return null;
//    }
//}
